package com.itheima.login;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * 利用面向对象思想设计登录系统，包含：账户密码登录、手机验证码登录 、邮箱登录。登录系统必须满足扩展性好、维护性方便。
 * > 提示：定义LoginStrategy接口，包含login()方法用于实现不同方式的登录操作。然后根据不同的登录方式，分别创建实现LoginStrategy接口的实现类。
 * > 要求：
 * > - 账户密码登录实现类（AccountLoginImpl），账户名只能包含字母、数字、下划线；密码必须大于6位
 * > - 手机号验证码登录实现类（PhoneCodeLoginImpl），手机号必须合法
 * > - 邮箱登录实现类（EmailLoginImpl），邮箱必须合法
 * <p>
 * 扩展性测试：（新增登录业务不会影响其他登录业务代码）
 * <p>
 * - 新增扫码登录（QRCodeLoginImpl）
 * <p>
 * 维护性测试：（只需要在AccountLoginImpl实现类中修改代码，不影响其他类）
 * - 针对账户密码登录，对密码的有效验证业务进行变更：密码必须是纯数字且大于6位
 */

public class Test {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        //
        ArrayList<User> list=new ArrayList<User>();


        User emailLogin = new EmailLoginImpl("867680442@qq.com","618719");
        User phoneCodeLogin = new PhoneCodeLoginImpl("13273880171","618719");
        User user = new AccountLoginImpl("ysh_00618","618719");

        list.add(emailLogin);
        list.add(phoneCodeLogin);
        list.add(user);

        //登录界面
        System.out.println("请输入账号");
        String id=scanner.next();
        int index = judge(list, id);

        if (list.get(index) instanceof AccountLoginImpl){
            boolean checkId = checkId(id);
            if (checkId==true){
                boolean b = judgePassWorld(index, list, scanner);
            }

        }if (list.get(index) instanceof EmailLoginImpl){
            boolean checkEmail = checkEmail(id);
            if (checkEmail==true){
                boolean b = judgePassWorld(index, list, scanner);
            }

        }if (list.get(index)instanceof PhoneCodeLoginImpl){
            boolean checkPhoneCode = checkPhoneCode(id);
            if (checkPhoneCode==true){
                boolean b = judgePassWorld(index, list, scanner);
            }

        }

    }


    //判断手机号是否合法
    public static boolean checkPhoneCode(String phoneCode) {
      /*  System.out.println("请输入手机号");
        String phoneCode=scanner.next();*/
        if (phoneCode.matches("[1][3-8]\\d{8,9}")){
            System.out.println("您输入的手机号格式正确");
            return true;
        }else {
            System.out.println("您输入的手机号格式不正确");
            return false;
        }
}

    //判断邮箱是否合法
    public static boolean checkEmail(String emailId) {
/*
        System.out.println("请输入您的邮箱");
        String emailId=scanner.next();*/
        if (emailId.matches("\\w{2}@\\w{2,20}(\\.\\w{2,10}){1,2}")){
            System.out.println("您输入的邮箱格式正确");
            return true;
        }else {
            System.out.println("您输入的邮箱格式错误");
            return false;
        }


    }

    //判断账号是否合法
    //账户名只能包含字母、数字、下划线；密码必须大于6位
    // 针对账户密码登录，对密码的有效验证业务进行变更：
    //              密码必须是纯数字且大于6位
    public static boolean checkId(String passId) {
       /* System.out.println("请输入账号");
        String passId=scanner.next();*/
        if (passId.matches("[1-9&&[a-z]&&[A-Z]] [0-9&&[a-z]&&[A-Z]&&[_]]{5,9}")){
            System.out.println("账号格式正确");
            return true;

        }else {
            System.out.println("账号格式错误");
            return false;

        }
    }

    //判断是否存在
    public static int judge(ArrayList<User> list,String id){
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).getPassId().equals(id)){
                return i;
            }
        }
        return -1;
    }

    //判断密码是否正确
    public static boolean judgePassWorld(int index,ArrayList<User> list,Scanner scanner){
        System.out.println("请输入密码");
        String passWorld=scanner.next();
        if (passWorld.length()==6){
            if (   list.get(index).getGetPassWorld().equals(passWorld)){
                System.out.println("登录成功");
            return true;
            }else {
                System.out.println("密码错误");
            return false;
            }

        }else {
            return false;
        }


    }

}
